package fun_Implement

import (
	"gitee.com/huanminabc/go-utils/common"
	"gitee.com/huanminabc/go-utils/encrypt"
	"gitee.com/huanminabc/go-utils/request"
	"go-LineScriptCommand/container"
	"strconv"
	"strings"
)

func init() {
	var funs = []container.Fun{
		telnet,
		ping,
		domainRealIp,
		wget,
		net,
	}
	common.InsertSliceBatch(&funs)
	container.RegisterFunList(funs)
	container.RegisterType("network.", funs)
}

func net(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能:  网络请求, get,post,put,delete
签名:  net(url,method,params,headers)
- method: 请求方法
- url: 请求地址
- params: 请求参数,格式为json字符串,如 {'key':'value'},无论是get还是post格式都是json
- headers: 请求头,格式为json字符串,如 {'key':'value'}
示例:
1. net('http://www.baidu.com',get) 返回百度首页
2. net('http://www.baidu.com',post,{},{})
`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if len(args) > 0 && container.GetPrePipelineData().Data != "" {
		//判断是否是http请求
		data := container.GetPrePipelineData().Data
		if common.IsUrl(data) {
			container.GetPrePipelineDataAndData(&args)
		}
	}
	//如果参数大于2
	if len(args) > 2 {
		//那么给第3个参数解密
		args[2] = encrypt.Base64StrDecode(args[2])
	}
	//如果参数大于3
	if len(args) > 3 {
		//那么给第4个参数解密
		args[3] = encrypt.Base64StrDecode(args[3])
	}

	//获取参数个数
	switch len(args) {
	case 1:
		result, err := request.NewHttpClient().AddUrl(args[0]).Get().Sync()
		if err != nil {
			panic(err.Error())
		}
		return result
	case 2:
		setMethod := args[1]
		//转换为大写
		setMethod = strings.ToUpper(setMethod)
		result, err := request.NewHttpClient().AddUrl(args[0]).SetMethod(setMethod).Sync()
		if err != nil {
			panic(err.Error())
		}
		return result
	case 3:
		setMethod := args[1]
		//转换为大写
		setMethod = strings.ToUpper(setMethod)
		// {'key':'value'} 转换为 {"key":"value"}
		str := args[2]
		//替换单引号为双引号
		str = strings.Replace(str, "'", "\"", -1)
		result, err := request.NewHttpClient().AddUrl(args[0]).SetMethod(setMethod).AddData(str).Sync()
		if err != nil {
			panic(err.Error())
		}
		return result
	case 4:
		setMethod := args[1]
		//转换为大写
		setMethod = strings.ToUpper(setMethod)
		// {'key':'value'} 转换为 {"key":"value"}
		str := args[2]
		//替换单引号为双引号
		str = strings.Replace(str, "'", "\"", -1)
		// {'key':'value'} 转换为 {"key":"value"}
		headers := args[3]
		//替换单引号为双引号
		headers = strings.Replace(headers, "'", "\"", -1)
		newHttpClient := request.NewHttpClient().AddUrl(args[0]).SetMethod(setMethod)
		//将请求头转换为map
		toMap := common.JsonToMap(headers)
		//遍历请求头
		for k, v := range toMap {
			newHttpClient.AddHeader(k, v)
		}
		//判断请求头Content-Type如果是form-data那么就是表单提交
		if toMap["Content-Type"] == "multipart/form-data" || toMap["Content-Type"] == "application/x-www-form-urlencoded" {
			for k, v := range toMap {
				newHttpClient.AddHeader(k, v)
			}
		} else {
			newHttpClient.AddData(str)
		}
		result, err := newHttpClient.Sync()
		if err != nil {
			panic(err.Error())

		}
		return result
	}
	panic("net函数参数个数不正确")
}

func telnet(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 检查主机端口是否开放
签名: telnet(value, port) true/false
- value: ip或域名
- port: 端口
示例:	
1. telnet(127.0.0.1, 80) 返回 true
`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if len(args) == 1 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 2 {
		panic("telnet函数参数个数不正确")
	}
	//拆分参数
	host := args[0]
	port := args[1]
	atoi, err := strconv.Atoi(port)
	if err != nil {
		panic("telnet函数参数端口不是数字")
	}
	//调用函数
	result := common.Telnet(host, atoi)
	return strconv.FormatBool(result)

}

func ping(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 检查ip或域名是否可以ping通
签名: ping(value) true/false
- value: ip或域名
示例:
1. ping(127.0.0.1) 返回 true
2. ping(www.baidu.com) 返回 true
`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 1 {
		panic("ping函数参数个数不正确")
	}
	//拆分参数
	value := args[0]
	//调用函数
	result := common.Ping(value)
	return strconv.FormatBool(result)
}
func domainRealIp(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取域名的真实ip
签名: domainRealIp(domain) 
- domain: 域名
示例:
1. domainRealIp(www.baidu.com) 返回127.0.0.1
`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 1 {
		panic("domainRealIp函数参数个数不正确")
	}
	//拆分参数
	domain := args[0]
	//调用函数
	result := common.GetDomainRealIp(domain)
	return result
}

// 下载网络文件
func wget(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 通过url下载网络文件
签名: downFile(url,local)
- url: 网络文件地址
- local: 本地文件地址
示例:
1. downFile('https://www.baidu.com/img/bd_logo1.png',/tmp/bd_logo1.png) 返回true ,避免特殊字符用单引号括起来
`
	}

	if len(args) == 1 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 2 {
		panic("downFile函数参数个数不正确")
	}
	url := args[0]
	local := args[1]
	request.NewHttpClient().AddUrl(url).DownloadFile(local)
	return "true"
}
